/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufsc.aps.convocados;

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

/**
 *
 * @author gustavo.ramos
 */
public class PanelTabuleiro extends javax.swing.JPanel implements JanelaListener {

    /**
     * Creates new form PanelTabuleiro
     */
    public PanelTabuleiro(Frame base) {
        this.base = base;
        initComponents();
        pDefesaT1.setBorder(new DashBorder());
        pMeioT1.setBorder(new DashBorder());
        pAtaqueT1.setBorder(new DashBorder());
        pDefesaT2.setBorder(new DashBorder());
        pMeioT2.setBorder(new DashBorder());
        pAtaqueT2.setBorder(new DashBorder());
        actionsPanel.setVisible(true);
        panelAguardando.setVisible(false);
        panelSubstituicao.setVisible(false);
        panelMeusJogadores.setLayout(new GridLayout(2, 3));
        labelBola.setIcon(new ImageIcon(System.getProperty("user.dir") + "/resources/soccerball_rolling.gif"));
        this.atorJogador = base.getJogador();
        this.atorJogador.setTabuleiroPanel(this);
    }
    AtorJogador atorJogador = null;
    private Frame base = null;
    boolean substituicao = false;
    boolean completarJogo = false;

    public Frame getParentFrame() {
        return base;
    }

    private void cancelarSubstituicao() {
        bSubstituir.setText("Substituir Jogador");
        actionsPanel.setVisible(false);
        substituicao = false;
        panelSubstituicao.removeAll();
        removeMouseListenerSubstituicao();
    }

    /**
     * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The content of this method is always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        labelStatus = new javax.swing.JLabel();
        panelCampo = new ImagePanel(System.getProperty("user.dir")+"/resources/Gramado_M.jpg");
        pAtaqueT1 = new javax.swing.JPanel();
        pDefesaT1 = new javax.swing.JPanel();
        pMeioT1 = new javax.swing.JPanel();
        pDefesaT2 = new javax.swing.JPanel();
        pMeioT2 = new javax.swing.JPanel();
        pAtaqueT2 = new javax.swing.JPanel();
        panelMeusJogadores = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        labelPlacarTecnico = new javax.swing.JLabel();
        labelPlacarOponente = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        labelDefesaTecnico = new javax.swing.JLabel();
        labelMeioTecnico = new javax.swing.JLabel();
        labelAtaqueTecnico = new javax.swing.JLabel();
        labelDefesaOponente = new javax.swing.JLabel();
        labelMeioOponente = new javax.swing.JLabel();
        labelAtaqueOponente = new javax.swing.JLabel();
        panelTecnico = new javax.swing.JPanel();
        labelEsquemaTecnico = new javax.swing.JLabel();
        panelOponente = new javax.swing.JPanel();
        labelEsquemaOponente = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        bTrocarEsquema = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        bSubstituir = new javax.swing.JButton();
        actionsPanel = new javax.swing.JPanel();
        panelAguardando = new javax.swing.JPanel();
        labelBola = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        panelSubstituicao = new javax.swing.JPanel();

        setMinimumSize(new java.awt.Dimension(896, 609));
        setPreferredSize(new java.awt.Dimension(896, 609));
        setLayout(null);

        labelStatus.setBackground(new java.awt.Color(255, 102, 255));
        labelStatus.setOpaque(true);
        add(labelStatus);
        labelStatus.setBounds(0, 590, 900, 20);

        panelCampo.setBackground(new java.awt.Color(255, 255, 255));
        panelCampo.setPreferredSize(new java.awt.Dimension(540, 360));
        panelCampo.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        pAtaqueT1.setOpaque(false);
        pAtaqueT1.setPreferredSize(new java.awt.Dimension(60, 320));

        javax.swing.GroupLayout pAtaqueT1Layout = new javax.swing.GroupLayout(pAtaqueT1);
        pAtaqueT1.setLayout(pAtaqueT1Layout);
        pAtaqueT1Layout.setHorizontalGroup(
            pAtaqueT1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 60, Short.MAX_VALUE)
        );
        pAtaqueT1Layout.setVerticalGroup(
            pAtaqueT1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );

        panelCampo.add(pAtaqueT1, new org.netbeans.lib.awtextra.AbsoluteConstraints(190, 20, -1, -1));

        pDefesaT1.setOpaque(false);
        pDefesaT1.setPreferredSize(new java.awt.Dimension(60, 320));

        javax.swing.GroupLayout pDefesaT1Layout = new javax.swing.GroupLayout(pDefesaT1);
        pDefesaT1.setLayout(pDefesaT1Layout);
        pDefesaT1Layout.setHorizontalGroup(
            pDefesaT1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 60, Short.MAX_VALUE)
        );
        pDefesaT1Layout.setVerticalGroup(
            pDefesaT1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );

        panelCampo.add(pDefesaT1, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 20, -1, -1));

        pMeioT1.setOpaque(false);
        pMeioT1.setPreferredSize(new java.awt.Dimension(60, 320));

        javax.swing.GroupLayout pMeioT1Layout = new javax.swing.GroupLayout(pMeioT1);
        pMeioT1.setLayout(pMeioT1Layout);
        pMeioT1Layout.setHorizontalGroup(
            pMeioT1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 60, Short.MAX_VALUE)
        );
        pMeioT1Layout.setVerticalGroup(
            pMeioT1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );

        panelCampo.add(pMeioT1, new org.netbeans.lib.awtextra.AbsoluteConstraints(115, 20, -1, -1));

        pDefesaT2.setOpaque(false);
        pDefesaT2.setPreferredSize(new java.awt.Dimension(60, 320));

        javax.swing.GroupLayout pDefesaT2Layout = new javax.swing.GroupLayout(pDefesaT2);
        pDefesaT2.setLayout(pDefesaT2Layout);
        pDefesaT2Layout.setHorizontalGroup(
            pDefesaT2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 60, Short.MAX_VALUE)
        );
        pDefesaT2Layout.setVerticalGroup(
            pDefesaT2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );

        panelCampo.add(pDefesaT2, new org.netbeans.lib.awtextra.AbsoluteConstraints(440, 20, -1, -1));

        pMeioT2.setOpaque(false);
        pMeioT2.setPreferredSize(new java.awt.Dimension(60, 320));

        javax.swing.GroupLayout pMeioT2Layout = new javax.swing.GroupLayout(pMeioT2);
        pMeioT2.setLayout(pMeioT2Layout);
        pMeioT2Layout.setHorizontalGroup(
            pMeioT2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 60, Short.MAX_VALUE)
        );
        pMeioT2Layout.setVerticalGroup(
            pMeioT2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );

        panelCampo.add(pMeioT2, new org.netbeans.lib.awtextra.AbsoluteConstraints(365, 20, -1, -1));

        pAtaqueT2.setOpaque(false);
        pAtaqueT2.setPreferredSize(new java.awt.Dimension(60, 320));

        javax.swing.GroupLayout pAtaqueT2Layout = new javax.swing.GroupLayout(pAtaqueT2);
        pAtaqueT2.setLayout(pAtaqueT2Layout);
        pAtaqueT2Layout.setHorizontalGroup(
            pAtaqueT2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 60, Short.MAX_VALUE)
        );
        pAtaqueT2Layout.setVerticalGroup(
            pAtaqueT2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 320, Short.MAX_VALUE)
        );

        panelCampo.add(pAtaqueT2, new org.netbeans.lib.awtextra.AbsoluteConstraints(290, 20, -1, -1));

        add(panelCampo);
        panelCampo.setBounds(30, 80, 540, 360);

        panelMeusJogadores.setBorder(javax.swing.BorderFactory.createTitledBorder("Meus Jogadores"));
        panelMeusJogadores.setLayout(null);
        add(panelMeusJogadores);
        panelMeusJogadores.setBounds(580, 20, 300, 330);

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Placar"));

        labelPlacarTecnico.setText("jLabel1");
        labelPlacarTecnico.setMaximumSize(new java.awt.Dimension(84, 14));
        labelPlacarTecnico.setPreferredSize(new java.awt.Dimension(84, 14));

        labelPlacarOponente.setText("jLabel2");
        labelPlacarOponente.setMaximumSize(new java.awt.Dimension(84, 14));
        labelPlacarOponente.setPreferredSize(new java.awt.Dimension(84, 14));

        jLabel3.setText("Defesa");

        jLabel4.setText("Meio");

        jLabel5.setText("Ataque");

        labelDefesaTecnico.setText("0");

        labelMeioTecnico.setText("0");

        labelAtaqueTecnico.setText("0");

        labelDefesaOponente.setText("0");

        labelMeioOponente.setText("0");

        labelAtaqueOponente.setText("0");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelPlacarTecnico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(labelPlacarOponente, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelDefesaTecnico, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelDefesaOponente, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(34, 34, 34)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelMeioTecnico, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelMeioOponente, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(34, 34, 34)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelAtaqueTecnico, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(labelAtaqueOponente, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(39, 39, 39))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jLabel4)
                    .addComponent(jLabel5))
                .addGap(14, 14, 14)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelPlacarTecnico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(labelDefesaTecnico)
                    .addComponent(labelMeioTecnico)
                    .addComponent(labelAtaqueTecnico))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelPlacarOponente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(labelMeioOponente)
                    .addComponent(labelAtaqueOponente)
                    .addComponent(labelDefesaOponente))
                .addGap(32, 32, 32))
        );

        add(jPanel2);
        jPanel2.setBounds(580, 360, 300, 150);

        panelTecnico.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        labelEsquemaTecnico.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
        labelEsquemaTecnico.setText("0-0-0");

        javax.swing.GroupLayout panelTecnicoLayout = new javax.swing.GroupLayout(panelTecnico);
        panelTecnico.setLayout(panelTecnicoLayout);
        panelTecnicoLayout.setHorizontalGroup(
            panelTecnicoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelTecnicoLayout.createSequentialGroup()
                .addComponent(labelEsquemaTecnico)
                .addGap(0, 2, Short.MAX_VALUE))
        );
        panelTecnicoLayout.setVerticalGroup(
            panelTecnicoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelTecnicoLayout.createSequentialGroup()
                .addGap(0, 6, Short.MAX_VALUE)
                .addComponent(labelEsquemaTecnico, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        add(panelTecnico);
        panelTecnico.setBounds(30, 10, 100, 60);

        panelOponente.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        labelEsquemaOponente.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
        labelEsquemaOponente.setText("0-0-0");

        javax.swing.GroupLayout panelOponenteLayout = new javax.swing.GroupLayout(panelOponente);
        panelOponente.setLayout(panelOponenteLayout);
        panelOponenteLayout.setHorizontalGroup(
            panelOponenteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelOponenteLayout.createSequentialGroup()
                .addGap(0, 2, Short.MAX_VALUE)
                .addComponent(labelEsquemaOponente))
        );
        panelOponenteLayout.setVerticalGroup(
            panelOponenteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelOponenteLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(labelEsquemaOponente, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        add(panelOponente);
        panelOponente.setBounds(470, 450, 100, 65);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Trocar Esquema Tático"));
        jPanel1.setLayout(null);

        bTrocarEsquema.setText("0-0-0");
        bTrocarEsquema.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bTrocarEsquemaActionPerformed(evt);
            }
        });
        jPanel1.add(bTrocarEsquema);
        bTrocarEsquema.setBounds(10, 20, 140, 23);

        add(jPanel1);
        jPanel1.setBounds(170, 10, 160, 50);

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Substituição"));

        bSubstituir.setText("Substituir Jogador");
        bSubstituir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bSubstituirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addComponent(bSubstituir)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(bSubstituir))
        );

        add(jPanel3);
        jPanel3.setBounds(340, 10, 130, 50);

        panelAguardando.setMaximumSize(new java.awt.Dimension(430, 150));
        panelAguardando.setMinimumSize(new java.awt.Dimension(430, 150));

        jLabel2.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        jLabel2.setText("Aguardando Oponente");

        javax.swing.GroupLayout panelAguardandoLayout = new javax.swing.GroupLayout(panelAguardando);
        panelAguardando.setLayout(panelAguardandoLayout);
        panelAguardandoLayout.setHorizontalGroup(
            panelAguardandoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAguardandoLayout.createSequentialGroup()
                .addComponent(labelBola, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabel2)
                .addGap(0, 24, Short.MAX_VALUE))
        );
        panelAguardandoLayout.setVerticalGroup(
            panelAguardandoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(labelBola, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGroup(panelAguardandoLayout.createSequentialGroup()
                .addGap(53, 53, 53)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        actionsPanel.add(panelAguardando);

        javax.swing.GroupLayout panelSubstituicaoLayout = new javax.swing.GroupLayout(panelSubstituicao);
        panelSubstituicao.setLayout(panelSubstituicaoLayout);
        panelSubstituicaoLayout.setHorizontalGroup(
            panelSubstituicaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 430, Short.MAX_VALUE)
        );
        panelSubstituicaoLayout.setVerticalGroup(
            panelSubstituicaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 130, Short.MAX_VALUE)
        );

        actionsPanel.add(panelSubstituicao);

        add(actionsPanel);
        actionsPanel.setBounds(30, 450, 430, 130);
    }// </editor-fold>//GEN-END:initComponents

    private void bTrocarEsquemaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bTrocarEsquemaActionPerformed
        if (JOptionPane.showConfirmDialog(this.base, "Tem certeza que deseja trocar de esquema?", "Mensagem", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
            atorJogador.trocarEsquema();
        }
    }//GEN-LAST:event_bTrocarEsquemaActionPerformed

    private void bSubstituirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSubstituirActionPerformed
//        DialogPosicao dp = new DialogPosicao(base, true);
//        dp.setVisible(true);
//        if(dp.getTipoPosicao() != null){
//            
//        }
        if (!substituicao) {
            if (atorJogador.isCampoVazio()) {
                JOptionPane.showMessageDialog(this, "Não há jogadores para substituir em campo.", "Aviso.", JOptionPane.WARNING_MESSAGE);
            } else {
                int result = atorJogador.verificarSePodeSubstituir();
                if (result == 0) {

                    substituicao = true;
                    bSubstituir.setText("Cancelar");
                    JOptionPane.showMessageDialog(this, "Escolha o jogador que irá entrar em campo,\ndepois escolha o jogador que será substituído.", "Mensagem", JOptionPane.INFORMATION_MESSAGE);
                } else if (result == 1) {
                    this.exibirMensagem("Não é a sua vez!", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    this.exibirMensagem("Limite de substituições excedido!", JOptionPane.INFORMATION_MESSAGE);
                }
            }
        } else {
            cancelarSubstituicao();
        }

    }//GEN-LAST:event_bSubstituirActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel actionsPanel;
    private javax.swing.JButton bSubstituir;
    private javax.swing.JButton bTrocarEsquema;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JLabel labelAtaqueOponente;
    private javax.swing.JLabel labelAtaqueTecnico;
    private javax.swing.JLabel labelBola;
    private javax.swing.JLabel labelDefesaOponente;
    private javax.swing.JLabel labelDefesaTecnico;
    private javax.swing.JLabel labelEsquemaOponente;
    private javax.swing.JLabel labelEsquemaTecnico;
    private javax.swing.JLabel labelMeioOponente;
    private javax.swing.JLabel labelMeioTecnico;
    private javax.swing.JLabel labelPlacarOponente;
    private javax.swing.JLabel labelPlacarTecnico;
    private javax.swing.JLabel labelStatus;
    private javax.swing.JPanel pAtaqueT1;
    private javax.swing.JPanel pAtaqueT2;
    private javax.swing.JPanel pDefesaT1;
    private javax.swing.JPanel pDefesaT2;
    private javax.swing.JPanel pMeioT1;
    private javax.swing.JPanel pMeioT2;
    private javax.swing.JPanel panelAguardando;
    private javax.swing.JPanel panelCampo;
    private javax.swing.JPanel panelMeusJogadores;
    private javax.swing.JPanel panelOponente;
    private javax.swing.JPanel panelSubstituicao;
    private javax.swing.JPanel panelTecnico;
    // End of variables declaration//GEN-END:variables

    @Override
    public void waitFinished() {
    }

    @Override
    public void connectionLost(String msg) {
        base.changePanels("Connect");
    }

    private void mostrarAguardando() {
        actionsPanel.setVisible(true);
        panelSubstituicao.setVisible(false);
        panelAguardando.setVisible(true);
        labelStatus.setText("Aguardando ...");
    }

    public void montar() {
        Tabuleiro meuTabuleiro = atorJogador.getMeuTabuleiro();
        Component[] cs = panelMeusJogadores.getComponents();
        for (Component c : cs) {
            if (c instanceof JLabel) {
                panelMeusJogadores.remove(c);
            }
        }
        //MOSTRA JOGADORES DISPONIVEIS PARA ADICIONAR
        if (meuTabuleiro.getT1().getJogadores() != null) {

            panelMeusJogadores.setLayout(new GridLayout(2, 3));
            for (Jogador j : meuTabuleiro.getT1().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, true);
                lj.addMouseListener(createMouseListener(lj));
                panelMeusJogadores.add(lj);
            }
        }
        //MOSTRA JOGADORES NAS POSIÇOES
        pDefesaT1.removeAll();
        pMeioT1.removeAll();
        pAtaqueT1.removeAll();
        pDefesaT2.removeAll();
        pMeioT2.removeAll();
        pAtaqueT2.removeAll();
        if (meuTabuleiro.getT1().getDefesa() != null
                && !meuTabuleiro.getT1().getDefesa().getJogadores().isEmpty()) {
            pDefesaT1.setLayout(new GridLayout(meuTabuleiro.getT1().getDefesa().getJogadores().size(), 1));
            for (Jogador j : meuTabuleiro.getT1().getDefesa().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, false);
//                lj.addMouseListener(createMouseListener(lj));
                pDefesaT1.add(lj);
                pDefesaT1.repaint();
            }
        }
        if (meuTabuleiro.getT1().getMeio() != null
                && !meuTabuleiro.getT1().getMeio().getJogadores().isEmpty()) {
            pMeioT1.setLayout(new GridLayout(meuTabuleiro.getT1().getMeio().getJogadores().size(), 1));
            for (Jogador j : meuTabuleiro.getT1().getMeio().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, false);
//                lj.addMouseListener(createMouseListener(lj));
                pMeioT1.add(lj);
            }
        }
        if (meuTabuleiro.getT1().getAtaque() != null
                && !meuTabuleiro.getT1().getAtaque().getJogadores().isEmpty()) {
            GridLayout gl = new GridLayout(meuTabuleiro.getT1().getAtaque().getJogadores().size(), 1);
            gl.setVgap(3);
            pAtaqueT1.setLayout(gl);
            for (Jogador j : meuTabuleiro.getT1().getAtaque().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, false);
//                lj.addMouseListener(createMouseListener(lj));
                pAtaqueT1.add(lj);
            }
        }
        if (meuTabuleiro.getT2().getDefesa() != null
                && !meuTabuleiro.getT2().getDefesa().getJogadores().isEmpty()) {
            GridLayout gl = new GridLayout(meuTabuleiro.getT2().getDefesa().getJogadores().size(), 1);
            gl.setVgap(3);
            pDefesaT2.setLayout(gl);
            for (Jogador j : meuTabuleiro.getT2().getDefesa().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, false);
//                lj.addMouseListener(createMouseListener(lj));
                pDefesaT2.add(lj);
            }
        }
        if (meuTabuleiro.getT2().getMeio() != null
                && !meuTabuleiro.getT2().getMeio().getJogadores().isEmpty()) {
            pMeioT2.setLayout(new GridLayout(meuTabuleiro.getT2().getMeio().getJogadores().size(), 1));
            for (Jogador j : meuTabuleiro.getT2().getMeio().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, false);
//                lj.addMouseListener(createMouseListener(lj));
                pMeioT2.add(lj);
            }
        }
        if (meuTabuleiro.getT2().getAtaque() != null
                && !meuTabuleiro.getT2().getAtaque().getJogadores().isEmpty()) {
            pAtaqueT2.setLayout(new GridLayout(meuTabuleiro.getT2().getAtaque().getJogadores().size(), 1));
            for (Jogador j : meuTabuleiro.getT2().getAtaque().getJogadores()) {
                LabelJogador lj = new LabelJogador(j, false);
//                lj.addMouseListener(createMouseListener(lj));
                pAtaqueT2.add(lj);
            }
        }

        panelTecnico.setBorder(new TitledBorder(meuTabuleiro.getT1().getNome()));
        panelOponente.setBorder(new TitledBorder(meuTabuleiro.getT2().getNome()));

        labelPlacarTecnico.setText(meuTabuleiro.getT1().getNome());
        labelPlacarOponente.setText(meuTabuleiro.getT2().getNome());

        if (meuTabuleiro.getT1().isDaVez()) {
            labelStatus.setText("Faça sua jogada!");
            panelAguardando.setVisible(false);
        } else {
            mostrarAguardando();
        }

        //--
        //montar posições dos jogadores
        if (meuTabuleiro.getT1().getEsquemaAtual() != null) {
            bTrocarEsquema.setText(meuTabuleiro.getT1().getEsquemaReserva().toString());
            labelEsquemaTecnico.setText(meuTabuleiro.getT1().getEsquemaAtual().toString());
            labelDefesaTecnico.setText(meuTabuleiro.getT1().getDefesa().getTotalPontuacao().toString());
            labelMeioTecnico.setText(meuTabuleiro.getT1().getMeio().getTotalPontuacao().toString());
            labelAtaqueTecnico.setText(meuTabuleiro.getT1().getAtaque().getTotalPontuacao().toString());
        } else {
            labelEsquemaTecnico.setText("N/D");
        }
        if (meuTabuleiro.getT2().getEsquemaAtual() != null) {
            labelEsquemaOponente.setText(meuTabuleiro.getT2().getEsquemaAtual().toString());
            labelDefesaOponente.setText(meuTabuleiro.getT2().getDefesa().getTotalPontuacao().toString());
            labelMeioOponente.setText(meuTabuleiro.getT2().getMeio().getTotalPontuacao().toString());
            labelAtaqueOponente.setText(meuTabuleiro.getT2().getAtaque().getTotalPontuacao().toString());
        } else {
            labelEsquemaOponente.setText("N/D");
        }
        //montar pontuação
        //




        //--
//        this.repaint();
    }

    public EsquemaTatico solicitarEsquemaTatico(List<EsquemaTatico> esquemas) {
        panelAguardando.setVisible(false);
        DialogEsquemas de = new DialogEsquemas(base, esquemas);
        de.setVisible(true);
        int index = de.getSelectedIndex();
        mostrarAguardando();
        return esquemas.remove(index);
    }

    public void montarApenasNomesEEstrategia(Tabuleiro meuTabuleiro) {
        panelTecnico.setBorder(new TitledBorder(meuTabuleiro.getT1().getNome()));
        panelOponente.setBorder(new TitledBorder(meuTabuleiro.getT2().getNome()));
        if (meuTabuleiro.getT1().getEsquemaAtual() != null) {
            bTrocarEsquema.setText(meuTabuleiro.getT1().getEsquemaReserva().toString());
            labelEsquemaTecnico.setText(meuTabuleiro.getT1().getEsquemaAtual().toString());
        } else {
            labelEsquemaTecnico.setText("N/D");
        }
        if (meuTabuleiro.getT2().getEsquemaAtual() != null) {
            labelEsquemaOponente.setText(meuTabuleiro.getT2().getEsquemaAtual().toString());
        } else {
            labelEsquemaOponente.setText("N/D");
        }
    }

    void subscribeComponent(Component c) {
        if (c instanceof LabelJogador) {
            LabelJogador lj = (LabelJogador) c;
            lj.addMouseListener(createMouseListenerSubstituicao(lj));
        }
    }

    void unsubscribeComponent(Component c) {
        if (c instanceof LabelJogador) {
            LabelJogador lj = (LabelJogador) c;
            for (MouseListener ml : lj.getMouseListeners()) {
                lj.removeMouseListener(ml);
            }
        }
    }

    public void mountMouseListenerSubstituicao() {
        for (Component c : pDefesaT1.getComponents()) {
            subscribeComponent(c);
        }
        for (Component c : pMeioT1.getComponents()) {
            subscribeComponent(c);
        }
        for (Component c : pAtaqueT1.getComponents()) {
            subscribeComponent(c);
        }
    }

    public boolean adicionarJogador(boolean isSimples, Jogador j, boolean isFimDeJogo) {
        DialogPosicao dialog = new DialogPosicao(base, true);
        dialog.setVisible(true);
        TipoPosicao tp = dialog.getTipoPosicao();
        if (tp != null) {
            if (isSimples) {
                atorJogador.adicionarJogadorSimples(j, tp, isFimDeJogo);
            } else {
                atorJogador.adicionarJogador(j, tp);
            }
            return true;
        } else {
            return false;
        }
    }

    private MouseListener createMouseListener(final LabelJogador lj) {
        return new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {

                if (substituicao) {
                    actionsPanel.setVisible(true);
                    panelAguardando.setVisible(false);
                    panelSubstituicao.setVisible(true);
                    panelSubstituicao.removeAll();
                    panelSubstituicao.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 1));
                    panelSubstituicao.add(new LabelJogador(lj), 0);
                    ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "/resources/subs_icon.png");
                    JLabel setinhas = new JLabel(icon);
                    panelSubstituicao.add(setinhas, 1);
                    mountMouseListenerSubstituicao();
                } else {
                    adicionarJogador(completarJogo, lj.getJogador(), completarJogo);
                }

            }

            @Override
            public void mousePressed(MouseEvent e) {
//                    throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void mouseReleased(MouseEvent e) {
//                    throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                lj.getMe().setBackground(Color.YELLOW);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                lj.getMe().setBackground(null);
            }
        };
    }

    public void exibirMensagem(String ret, int optionPaneMessageType) {
        JOptionPane.showMessageDialog(this, ret, "MENSAGEM", optionPaneMessageType);
    }

    private MouseListener createMouseListenerSubstituicao(final LabelJogador lj) {
        return new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                panelSubstituicao.add(new LabelJogador(lj.getJogador(), true), 2);
                if (JOptionPane.showConfirmDialog(base, "Confirme substituição.", "Confirmar", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    Jogador novo = ((LabelJogador) (panelSubstituicao.getComponent(0))).getJogador();
                    Jogador substituido = ((LabelJogador) (panelSubstituicao.getComponent(2))).getJogador();
                    atorJogador.substituirJogador(novo, substituido);
                    cancelarSubstituicao();
                    mostrarAguardando();
                } else {
                    cancelarSubstituicao();
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
//                throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void mouseReleased(MouseEvent e) {
//                throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
//                throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void mouseExited(MouseEvent e) {
//                throw new UnsupportedOperationException("Not supported yet.");
            }
        };
    }

    public void removeMouseListenerSubstituicao() {
        for (Component c : pDefesaT1.getComponents()) {
            unsubscribeComponent(c);
        }
        for (Component c : pMeioT1.getComponents()) {
            unsubscribeComponent(c);
        }
        for (Component c : pAtaqueT1.getComponents()) {
            unsubscribeComponent(c);
        }
    }

    public void exibirDialogTrocarEsquema() {

        DialogTrocarEsquema dialog = new DialogTrocarEsquema(this, true, atorJogador.getMeuTabuleiro().getT1().getJogadoresTrocaEsquema());
        dialog.setVisible(true);
        //--
        atorJogador.enviarTrocaEsquema();
    }

    public void prepararBotoesCompletarJogo() {
        bSubstituir.setEnabled(false);
        bTrocarEsquema.setEnabled(false);
        completarJogo = true;
        this.exibirMensagem("Seu adversário completou 10 jogadores em campo.\n"
                + "O jogo está finalizando! A partir daqui você só poderá adicionar seus\n"
                + "jogadores disponíveis, até completar o décimo.", JOptionPane.INFORMATION_MESSAGE);
    }

    public void mostrarResultadoFinal(boolean euVenci) {
        if (euVenci) {
            this.exibirMensagem("Parabéns! Você venceu esta partida.", JOptionPane.INFORMATION_MESSAGE);
        } else {
            this.exibirMensagem("Mas que pena! Você perdeu esta partida.\nTente outra vez!", JOptionPane.INFORMATION_MESSAGE);
        }
        atorJogador.finalizarPartida();
        bSubstituir.setEnabled(true);
        bTrocarEsquema.setEnabled(true);
        base.changePanels("Connect");
    }

    class ImagePanel extends JPanel {

        private Image img;

        public ImagePanel(String img) {
            this(new ImageIcon(img).getImage());
        }

        public ImagePanel(Image img) {
            this.img = img;
            Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
            setPreferredSize(size);
            setMinimumSize(size);
            setMaximumSize(size);
            setSize(size);
            setLayout(null);
        }

        public void paintComponent(Graphics g) {
            g.drawImage(img, 0, 0, null);
        }
    }

    class DashBorder implements Border {

        private final Insets insets = new Insets(1, 1, 1, 1);
        private final int length = 5;
        private final int space = 3;

        public boolean isBorderOpaque() {
            return false;
        }

        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            g.setColor(new Color(102, 204, 0));
            // --- draw horizontal ---
            for (int i = 0; i < width; i += length) {
                g.drawLine(i, y, i + length, y);
                g.drawLine(i, height - 1, i + length, height - 1);
                i += space;
            }
            // --- draw vertical ---
            for (int i = 0; i < height; i += length) {
                g.drawLine(0, i, 0, i + length);
                g.drawLine(width - 1, i, width - 1, i + length);
                i += space;
            }
        }

        public Insets getBorderInsets(Component c) {
            return insets;
        }
    }
}
